package com.chapter1.basic;

import java.util.Stack;

import org.junit.Test;

/** 
 * @ClassName: Evaluate 
 * @Description: 双栈算法计算算术表达式
 * @author minjun minjun@bw30.com
 * @date 2015-2-11 下午9:55:40 
 *  
 */
public class Evaluate {

	@Test
	public void test(){
		System.out.println(simpleEvaluate("(1+((2+3)*(4*5)))"));
	}
	
	/**
	 * 
	* @Title: simpleEvaluate 
	* @Description: 简单的处理运算符（如果没有输入括号，只是单纯靠优先级，会计算错误） 
	* @param @param exp
	* @param @return    设定文件 
	* @return double    返回类型 
	* @throws
	 */
	public double simpleEvaluate(String exp){
		Stack<String> cal=new Stack<String>();
		Stack<Double> num=new Stack<Double>();
		
		for(int i=0;i<exp.length();i++){
			String a=exp.charAt(i)+"";
			
			try{
				num.push(Double.parseDouble(a));
			}catch (NumberFormatException e) {
				if("+".equals(a)||"-".equals(a)||"*".equals(a)||"/".equals(a)){
					cal.push(a);
				}else if(")".equals(a)){
					double after=num.pop();
					double before=num.pop();
					String method=cal.pop();
					if("+".equals(method)){
						num.push(before+after);
					}else if("-".equals(method)){
						num.push(before-after);
					}else if("*".equals(method)){
						num.push(before*after);
					}else if("/".equals(method)){
						num.push(before/after);
					}
				}
			}
			
		}
		
		return num.pop();
	}
}
